package user;

import book.Library;
import utils.LibrarySingleton;
import utils.PerminssionException;
import constant.Constant;

import java.io.IOException;

public class ProxyUser extends User {

    private User realUser;

    public Library library = null;

    public ProxyUser(User user) {
        super();
        realUser = user;
        library = LibrarySingleton.getInstance();
    } //我们在这里最开始的时候User中并没无参构造方法，所以使用super()时，要先在父类User中先定义一个无参构造方法，为什么不使用User中的有参构造方法吗？
    //因为我们的现在的业务是希望代理模式代理不同的角色执行不同的任务，所以我们的参数应该使用User user来接受不同的角色对象

    public User getRealUser() {
        return realUser; //我们通过这个方法做到返回我们现在的realUser也就是我们现在realUser引用的真实对象
    }

    //其他操作
    //--------------------------------管理员用户相关⽅法-----------------------------
    //调⽤菜单
    @Override
    public int display() {
        return realUser.display();
    }


    public void checkRealUserWhetherAdminUser(String message) {
        if (!(realUser instanceof AdminUser)) {
            throw new PerminssionException(message);
        }
    }

    //添加书籍操作
    public void addBook() {
        System.out.println("代理类的addbook");
        try {
            checkRealUserWhetherAdminUser("普通用户无权限添加书籍");
        } catch (PerminssionException e) {
            e.printStackTrace();
        }
        ((AdminUser) (this.realUser)).addBook();
    }

    //更新书籍操作
    public void updateBook() {
        System.out.println("代理类updateBook");
        try {
            checkRealUserWhetherAdminUser("普通用户无权限更新书籍");
        } catch (PerminssionException e) {
            e.printStackTrace();
        }
        ((AdminUser) (this.realUser)).updateBook();
    }

    //移除图书
    public void removeBook() {
        System.out.println("代理类removeBook");
        try {
            checkRealUserWhetherAdminUser("普通用户无权限下架书籍");
        } catch (PerminssionException e) {
            e.printStackTrace();
        }
        ((AdminUser) (this.realUser)).removeBook();
    }

    //查看图书的借阅次数
    public void borrowCount() {
        System.out.println("代理类borrowBook");
        try {
            checkRealUserWhetherAdminUser("普通用户无权限查阅书籍被借阅次数");
        } catch (PerminssionException e) {
            e.printStackTrace();
        }
        ((AdminUser) (this.realUser)).borrowCount();

    }

    //查看最受欢迎的前K本书
    public void generateBook() {
        System.out.println("代理类generateBook");
        try {
            checkRealUserWhetherAdminUser("普通用户无权限查阅最受欢迎的书籍");
        } catch (PerminssionException e) {
            e.printStackTrace();
        }
        ((AdminUser) (this.realUser)).generateBook();
    }

    //查看库存状态
    public void checkInventoryStatus() {
        System.out.println("代理类checkInventoryStatus");
        try {
            checkRealUserWhetherAdminUser("普通用户无权限查阅书籍库存状态");
        } catch (PerminssionException e) {
            e.printStackTrace();
        }
        ((AdminUser) (this.realUser)).checkInventoryStatus();
    }

    //移除上架超过1年的书籍
    public void checkAndRemoveOldBooks() {
        System.out.println("代理类checkAndRemoveOldBooks");
        try {
            checkRealUserWhetherAdminUser("普通用户无权限移除上架超过1年的书籍");
        } catch (PerminssionException e) {
            e.printStackTrace();
        }
        ((AdminUser) (this.realUser)).checkAndRemoveOldBooks();
    }

    //--------------------------------普通用户相关⽅法-----------------------------
    public void checkRealUserWhetherNormalUser(String message) {
        if (!(realUser instanceof NormalUser)) {
            throw new PerminssionException(message);
        }
    }

    //借阅图书
    public void borrowBook() throws IOException {
        System.out.println("代理类borrowBook");
        checkRealUserWhetherNormalUser("管理员请以普通用户借阅书籍");
        ((NormalUser) realUser).borrowBook();
    }
    //归还图书
    public void returnBook () throws IOException {
        System.out.println("代理类returnBook");
        checkRealUserWhetherNormalUser("管理员请以普通用户归还书籍");
        ((NormalUser) realUser).returnBook();
    }
    //查看个⼈借阅情况
    public void viewBorrowHistory () throws IOException {
        System.out.println("代理类viewBorrowHistory");
        checkRealUserWhetherNormalUser("管理员请以普通用户查看个人借阅情况");
        ((NormalUser) realUser).viewBorrowBooks();
    }

        /**
         * 通过代理类知道我们是哪个用户的哪个操作
         * @param choice
         */
        public void handleOperation(int choice) throws IOException {
            if (this.realUser instanceof AdminUser) {
                switch (choice) {
                    case Constant.SEARCH_BOOK:
                        library.searchBook();
                        break;
                    case Constant.DISPLAY_BOOK:
                        library.displayBooks();
                        break;
                    case Constant.EXIT:
                        library.exit();
                        break;
                    case Constant.ADD_BOOK:
                        addBook();
                        break;
                    case Constant.UPDATE_BOOK:
                        updateBook();
                        break;
                    case Constant.REMOVE_BOOK:
                        removeBook();
                        break;
                    case Constant.BORROWED_BOOK_COUNT:
                        borrowCount();
                        break;
                    case Constant.GENERATE_BOOK:
                        generateBook();
                        break;
                    case Constant.CHECK_INVENTORY_STATUS:
                        checkInventoryStatus();
                        break;
                    case Constant.CHECK_AND_REMOVE_OLD_BOOK:
                        checkAndRemoveOldBooks();
                        break;
                    default:
                        break;

                }
            } else {
                switch (choice) {
                    case Constant.SEARCH_BOOK:
                        library.searchBook();
                        break;
                    case Constant.DISPLAY_BOOK:
                        library.displayBooks();
                        break;
                    case Constant.EXIT:
                        library.exit();
                        break;
                    case Constant.BORROWED_BOOK:
                        borrowBook();
                        break;
                    case Constant.RETURN_BOOK:
                        returnBook();
                        break;
                    case Constant.VIEW_BORROW_HISTORY_BOOK:
                        viewBorrowHistory();
                        break;
                    default:
                        break;
                }
            }
        }

}
